package net.sf.rose.file.monitor;

import java.io.File;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

import net.sf.rose.util.RoseRuntimeException;

/**
 * @description : 使用apache的文件夹监听服务监听文件夹的变更情况
 * @author : fengjian
 * @since : 2021-07-03
 * @see FileAlterationListenerAdaptor
 */
public abstract class FileMonitor extends FileAlterationListenerAdaptor {

    /**
     * 启动监听器监听指定文件目录的变化
     * @param path     - 准备监听的文件目录
     * @param listener - 监听器
     */
    public static void start(File path, FileMonitor listener) {
        // 轮询间隔 3 秒
        long interval = TimeUnit.SECONDS.toMillis(3);
        // 创建过滤器
        IOFileFilter directories = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE);
        IOFileFilter files = FileFilterUtils.and(FileFilterUtils.fileFileFilter());
        /*
         * IOFileFilter files = FileFilterUtils.and( FileFilterUtils.fileFileFilter(),
         * FileFilterUtils.suffixFileFilter(".pdf"));
         */
        IOFileFilter filter = FileFilterUtils.or(directories, files);
        // 使用过滤器
        FileAlterationObserver observer = new FileAlterationObserver(path, filter);
        // 不使用过滤器
        // FileAlterationObserver observer = new FileAlterationObserver(new
        // File(rootDir));
        observer.addListener(listener);
        // 创建文件变化监听器
        FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
        // 开始监控
        try {
            monitor.start();
            System.out.println("开始使用" + listener.getClass().getName() + "监听文件目录" + path.getAbsolutePath() + "的变化...");
        } catch (Exception e) {
            throw new RoseRuntimeException(e);
        }
    }

    /**
     * 启动
     */
    @Override
    public void onStart(org.apache.commons.io.monitor.FileAlterationObserver observer) {
        super.onStart(observer);
    }

    /**
     * 目录创建
     */
    @Override
    public void onDirectoryCreate(File directory) {
    }

    /**
     * 目录修改
     */
    @Override
    public void onDirectoryChange(File directory) {
    }

    /**
     * 目录删除
     */
    @Override
    public void onDirectoryDelete(File directory) {
    }

    /**
     * 文件创建
     */
    @Override
    public void onFileCreate(File file) {
    }

    /**
     * 文件修改
     */
    @Override
    public void onFileChange(File file) {
    }

    /**
     * 文件删除
     */
    @Override
    public void onFileDelete(File file) {
    }

    /**
     * 停止
     */
    @Override
    public void onStop(org.apache.commons.io.monitor.FileAlterationObserver observer) {
        super.onStop(observer);
    }
}